package me.alex.learnkotlin.learnKT9

/**
 * 这是一个我们自己写的高阶函数了
 * 2个参数 num1和num2作为普通入参
 * operation作为函数作为第三个参数
 */
fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int {
    val result = operation(num1, num2)
    return result
}

inline fun num1AndNum2ForInline(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int {
    val result = operation(num1, num2)
    return result
}

/**
 * 这里我们再写2个函数配合使用
 */
fun plus(num1: Int, num2: Int): Int {
    return num1 + num2
}

fun minus(num1: Int, num2: Int): Int {
    return num1 - num2
}

/**
 * 这里给StringBuilder定义了一个build扩展函数,这个函数接收一个函数类型参数,返回值也是StringBuilder
 * 这里的函数声明才是定义高阶函数完整的语法.在函数类型前面加上ClassName,就表示这个函数类型是定义在哪个类当中的
 * 这里讲函数类型定义到StringBuilder,是为了当我们调用build函数时传入的Lambda表达式将会自动拥有StringBuilder的上下文
 * 同时这也是apply函数的实现方式
 */
fun StringBuilder.build(block: StringBuilder.() -> Unit): StringBuilder {
    block()
    return this
}